package com.sample.wanandroidx.app

import cat.ereza.customactivityoncrash.config.CaocConfig
import com.sample.library.Basic
import com.sample.library.cookie.CookieManager
import com.sample.library.util.SystemUtil
import com.sample.wanandroidx.BuildConfig
import com.sample.wanandroidx.R
import com.sample.wanandroidx.ui.home.StartActivity
import com.xuexiang.xpage.PageConfig
import com.xuexiang.xpage.base.XPageActivity
import okhttp3.OkHttpClient
import rxhttp.RxHttpPlugins
import rxhttp.wrapper.cahce.CacheMode
import rxhttp.wrapper.param.Param
import rxhttp.wrapper.param.RxHttp
import rxhttp.wrapper.ssl.HttpsUtils
import java.io.File
import java.util.concurrent.*
import javax.net.ssl.HostnameVerifier
import javax.net.ssl.SSLSession

object AppInitialization {
//    https://github.com/xuexiangjys/XPage/wiki/%E9%9B%86%E6%88%90%E6%8C%87%E5%8D%97
    @JvmStatic
    fun init(app: App) {
        Basic.init(app)
        initCrash()
        initRxHttp(app)
        PageConfig.getInstance().debug("PageLog") //开启调试
            .setContainActivityClazz(XPageActivity::class.java) //设置默认的容器Activity
            .init(app) //初始化页面配置
        //App.user = LitePal.findFirst(User::class.java)
    }

    private fun initCrash() {
        CaocConfig.Builder.create().backgroundMode(CaocConfig.BACKGROUND_MODE_SILENT) //背景模式,开启沉浸式
            .enabled(true) //是否启动全局异常捕获
            .showErrorDetails(true) //是否显示错误详细信息
            .showRestartButton(true) //是否显示重启按钮
            .trackActivities(true) //是否跟踪Activity
            .logErrorOnRestart(false) //default: true
            .minTimeBetweenCrashesMs(2000) //崩溃的间隔时间(毫秒)
            .errorDrawable(R.mipmap.ic_launcher_round) //错误图标
            .restartActivity(StartActivity::class.java) //重新启动后的activity
            .apply()
    }

    private fun initRxHttp(app: App) {
        val sslParams = HttpsUtils.getSslSocketFactory()

        val client = OkHttpClient.Builder().cookieJar(CookieManager.getInstance(app)).connectTimeout(10, TimeUnit.SECONDS)
            .readTimeout(10, TimeUnit.SECONDS).writeTimeout(10, TimeUnit.SECONDS)
            .sslSocketFactory(sslParams.sSLSocketFactory, sslParams.trustManager) //添加信任证书
            .hostnameVerifier(HostnameVerifier { hostname: String?, session: SSLSession? -> true }) //忽略host验证
            //.followRedirects(false)  //禁制OkHttp的重定向操作，我们自己处理重定向
            .build()
        //RxHttp初始化，自定义OkHttpClient对象，非必须
        RxHttp.init(client, BuildConfig.DEBUG)

        //设置缓存策略，非必须
        val cacheFile = File(app.externalCacheDir, "HTTP_CACHE_PATH")
        //先请求网络，失败后再读取缓存  (网络请求成功，写缓存)
        RxHttpPlugins.setCache(cacheFile, 1000 * 100.toLong(), CacheMode.REQUEST_NETWORK_FAILED_READ_CACHE)
        //每次发起请求，时间戳都不一样 此时需要剔除不参与CacheKey组拼的参数
        RxHttpPlugins.setExcludeCacheKeys("_t", "_s", "_id")

        RxHttp.setOnParamAssembly { p: Param<*> ->
            /*根据不同请求添加不同参数，子线程执行，每次发送请求前都会被回调
            如果希望部分请求不回调这里，发请求前调用Param.setAssemblyEnabled(false)即可*/

            //如果使用时间戳 则每次请求的地址都不一致 则每次写缓存的Key都不一样

            /*deviceId如果为空 就生成一个UUID存在本地外置存储*/
            //            var deviceId = DeviceConfig.getDeviceId(app)
            //            if (deviceId.isNullOrEmpty() || deviceId.isBlank()) {
            //                deviceId = SystemUtil.getUUID(app)
            //            }
            //            p.addHeader("deviceId", deviceId)
            p.addHeader("deviceType", "android") //添加公共请求头
            p.addHeader("versionName", SystemUtil.getVersionName(app))
            p
        }
    }
}

